// Copyright (c) XiGuan 2023
// Author： xiguan
// Email: xiguan.teng@qq.com
// Create on 2023/11/15
// TODO:
//

#ifndef WEBSERVER_SERVER_EPOLLER_H
#define WEBSERVER_SERVER_EPOLLER_H

#include <sys/epoll.h>
#include <sys/types.h>

#include <vector>

class Epoller {
 private:
  int epoll_fd_;

  std::vector<struct epoll_event> epoll_events_;

 public:
  explicit Epoller(int max_event = 1024);

  ~Epoller();

  /**
   * @brief     添加文件描述符到epoll
   * @param fd
   * @param event
   * @return
   */
  bool add_fd(int fd, uint32_t event);

  /**
   * @brief     修改epoll中文件描述符
   * @param fd
   * @param event
   * @return
   */
  bool mod_fd(int fd, uint32_t event);

  /**
   * @brief     删除epoll中的指定文件描述符
   * @param fd
   * @return
   */
  bool del_fd(int fd);

  /**
   * @brief     等待epoll反应
   * @param timeout
   * @return    返回接收信号的文件描述符个数
   */
  int wait(int timeout = -1);

  /**
   * @brief     获取指定已发生变化epoll events位置的的文件描述符
   * @param idx
   * @return
   */
  int GetEventFd(size_t idx) const;

  /**
   * @brief     获取指定已发生变化epoll events位置的的事件类型
   * @param idx
   * @return
   */
  uint32_t GetEvent(size_t idx) const;
};

#endif  // WEBSERVER_SERVER_EPOLLER_H
